package com.banmao.rabbitmq;

import com.banmao.rabbitmq.utils.RabbitUtil;
import com.rabbitmq.client.*;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

// 消息消费者
@Slf4j
public class Consumer {

    public static void main(String[] args) throws Exception {
        Connection conn = RabbitUtil.getConnection();
        // 创建通信通道
        // 相当于 TCP 中的虚拟连接，降低开销成本
        Channel channel = conn.createChannel();

        channel.queueDeclare("helloWorld", false, false, false, null);

        log.info("开始监听通道 helloWorld 队列");

        // 创建一个消息消费者
        // 参数1：队列名称
        // 参数2：是否自动确认收到，false 手动编程确认收到（RabbitMQ 推荐）
        // 参数3：DefaultConsumer 的实现类，消息处理类
        channel.basicConsume("helloWorld", false, new Receiver(channel));

//        channel.close();
//        conn.close();
    }

}

// 继承消费者处理类
@Slf4j
class Receiver extends DefaultConsumer {

    private Channel channel;

    public Receiver(Channel channel) {
        super(channel);
        this.channel = channel;
    }

    // 对消息进行处理
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String msg = new String(body);
        log.info("消息接收到: {}", msg);

        if (msg.contains("-4")) {
            // 进行消息确认
            // 参数1：获取消息ID
            // 参数2：是否确认签收消费者所有消息，false-只签收这一个消息，true-签收该消费者所有未签收的消息
            this.channel.basicAck(envelope.getDeliveryTag(), true);
            log.info("{} chacked", msg);
        }
    }
}

